home *** CD-ROM | disk | FTP | other *** search
/ Power Programmierung / Power-Programmierung (Tewi)(1994).iso / magazine / nan_news / toolkit / proper.c < prev    next >
Text File  |  1991-08-15  |  3KB  |  127 lines

  1. /*
  2.  * File......: PROPER.C
  3.  * Author....: Robert DiFalco and Glenn Scott
  4.  * Date......: $Date:   15 Aug 1991 23:08:22  $
  5.  * Revision..: $Revision:   1.2  $
  6.  * Log file..: $Logfile:   E:/nanfor/src/proper.c_v  $
  7.  * 
  8.  * This is an original work by Glenn Scott and Robert DiFalco
  9.  * and is placed in the public domain.
  10.  *
  11.  * Modification history:
  12.  * ---------------------
  13.  *
  14.  * $Log:   E:/nanfor/src/proper.c_v  $
  15.  * 
  16.  *    Rev 1.2   15 Aug 1991 23:08:22   GLENN
  17.  * Forest Belt proofread/edited/cleaned up doc
  18.  * 
  19.  *    Rev 1.1   14 Jun 1991 19:53:50   GLENN
  20.  * Minor edit to file header
  21.  * 
  22.  *    Rev 1.0   01 Apr 1991 01:02:56   GLENN
  23.  * Nanforum Toolkit
  24.  * 
  25.  *
  26.  */
  27.  
  28.  
  29. /*  $DOC$
  30.  *  $FUNCNAME$
  31.  *     FT_PROPER()
  32.  *  $CATEGORY$
  33.  *     String
  34.  *  $ONELINER$
  35.  *     Convert a string to proper-name case
  36.  *  $SYNTAX$
  37.  *     FT_PROPER( <cString> ) -> cProperName
  38.  *  $ARGUMENTS$
  39.  *     <cString> is the string to be converted.
  40.  *  $RETURNS$
  41.  *     A string of the same length as <cString>, only converted to 
  42.  *     proper name case (upper/lower case).
  43.  *  $DESCRIPTION$
  44.  *     FT_PROPER() uses a brute-force algorithm to convert a string
  45.  *     to propername case.  First, it capitalizes the first letter of 
  46.  *     all words starting after a blank, dash, or apostrophe.  This
  47.  *     catches most names, including special cases such as names
  48.  *     beginning with O' (O'Malley, O'Reilly) and hyphenated names
  49.  *     (such as Susan Chia-Mei Lo).
  50.  *
  51.  *     Next, it does a specific adjustment for words beginning in "Mc"
  52.  *     It finds the first 'Mc' and capitalizes the next character after
  53.  *     it.  It does this for all occurrences of Mc.
  54.  *
  55.  *     The original FT_PROPER() was written in Clipper by Glenn Scott
  56.  *     and Mark Zechiel; it was re-written in C (and thus, optimized
  57.  *     and enhanced) by Robert DiFalco.
  58.  *  $EXAMPLES$
  59.  *       FUNCTION main( cStr )
  60.  *         OutStd( FT_PROPER( cStr ) + chr(13) + chr(10) )
  61.  *       RETURN ( nil )
  62.  *  $END$
  63.  */
  64.  
  65.  
  66. #include "extend.h"
  67.  
  68.  
  69. CLIPPER FT_PROPER()
  70. {
  71.   int  iLen   =  _parclen(1);
  72.   char *cStr  =  _parc(1);
  73.  
  74.   int i, fCap = TRUE, iPos = 0;
  75.  
  76.   for( i = 0; i < iLen + 1; i++ ) {
  77.      if( _ftIsAlpha( cStr[i] ) == TRUE )  {
  78.         if( fCap == TRUE )
  79.            cStr[i] = _ftToUpper( cStr[i] );
  80.         else cStr[i] = _ftToLower( cStr[i] );
  81.         }
  82.      fCap = ( cStr[i] == ' ' || cStr[i] == '-' || cStr[i] == 0x27 );
  83.   }
  84.  
  85.   // Find "Mc"
  86.   for( i = 0; i <= iLen; i++ )
  87.      if( cStr[i] == 'M' && cStr[i+1] == 'c' ) {
  88.         cStr[i+2] = _ftToUpper( cStr[i+2] );
  89.      }
  90.  
  91.   /* // If "Mc" was found, Cap next letter if Alpha
  92.   if( iPos > 1 )
  93.      if( iPos < iLen )
  94.         if( _ftIsUpper( cStr[iPos] ) == FALSE )
  95.            cStr[iPos] = _ftToUpper( cStr[iPos] );
  96.   */   
  97.   _retc( cStr );
  98.   return;
  99. }
  100.  
  101. static int _ftIsAlpha( char c )
  102. {
  103.   return( _ftIsUpper(c) || _ftIsLower(c));
  104. }
  105.  
  106. static int _ftToLower( char c )
  107. {
  108.   return(c >= 'A' && c <= 'Z' ? c - 'A' + 'a' : c);
  109. }
  110.  
  111.  
  112. static int _ftToUpper( char c )
  113. {
  114.   return(c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c);
  115. }
  116.  
  117. static int _ftIsUpper( char c )
  118. {
  119.   return(c >= 'A' && c <= 'Z');
  120. }
  121.  
  122.  
  123. static int _ftIsLower( char c )
  124. {
  125.   return(c >= 'a' && c <= 'z');
  126. }
  127.